From: Wei Liu Date: Tue, 7 Jun 2016 09:03:39 +0000 (+0100) Subject: libxl: introduce libxl__qmp_query_cpus X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~806 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=324bd8f5dce20d0a1dbbd9480f89673a18e1db53;p=xen.git libxl: introduce libxl__qmp_query_cpus It interrogates QEMU for CPUs and update the bitmap accordingly. Signed-off-by: Wei Liu Reviewed-by: Dario Faggioli Reviewed-by: Anthony PERARD Acked-by: Ian Jackson --- diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index de7757926b..e33c710f09 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1794,6 +1794,9 @@ _hidden int libxl__qmp_set_global_dirty_log(libxl__gc *gc, int domid, bool enabl _hidden int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, const libxl_device_disk *disk); /* Add a virtual CPU */ _hidden int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int index); +/* Query the bitmap of CPUs */ +_hidden int libxl__qmp_query_cpus(libxl__gc *gc, int domid, + libxl_bitmap *map); /* Start NBD server */ _hidden int libxl__qmp_nbd_server_start(libxl__gc *gc, int domid, const char *host, const char *port); diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 3eb279aacc..63c49c5070 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -979,6 +979,44 @@ int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int idx) return qmp_run_command(gc, domid, "cpu-add", args, NULL, NULL); } +static int query_cpus_callback(libxl__qmp_handler *qmp, + const libxl__json_object *response, + void *opaque) +{ + libxl_bitmap *map = opaque; + unsigned int i; + const libxl__json_object *cpu = NULL; + int rc; + GC_INIT(qmp->ctx); + + libxl_bitmap_set_none(map); + for (i = 0; (cpu = libxl__json_array_get(response, i)); i++) { + unsigned int idx; + const libxl__json_object *o; + + o = libxl__json_map_get("CPU", cpu, JSON_INTEGER); + if (!o) { + LOG(ERROR, "Failed to retrieve CPU index."); + rc = ERROR_FAIL; + goto out; + } + + idx = libxl__json_object_get_integer(o); + libxl_bitmap_set(map, idx); + } + + rc = 0; +out: + GC_FREE; + return rc; +} + +int libxl__qmp_query_cpus(libxl__gc *gc, int domid, libxl_bitmap *map) +{ + return qmp_run_command(gc, domid, "query-cpus", NULL, + query_cpus_callback, map); +} + int libxl__qmp_nbd_server_start(libxl__gc *gc, int domid, const char *host, const char *port) {